/* TODO
 * cite the source 
 */
package com.isecpartners.samplesync.s3;

import android.app.Activity;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FilenameFilter;
import java.util.ArrayList;

import com.isecpartners.samplesync.R;

import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.TextView;

public class FilePickerActivity extends Activity{
	 
	 public static final String TAG = "s3.FilePickerActivity";
	// Stores names of traversed directories
			ArrayList<String> str = new ArrayList<String>();

			// Check if the first level of the directory structure is the one showing
			private Boolean firstLvl = true;
			private Item[] fileList;
			private File path = new File(Environment.getExternalStorageDirectory() + "");
			private String chosenFile;
			private static final int DIALOG_LOAD_FILE = 1000;

			ListAdapter adapter;

			@Override
			public void onCreate(Bundle savedInstanceState) {

				super.onCreate(savedInstanceState);
				setContentView(R.layout.filepicker);
				loadFileList();

				showDialog(DIALOG_LOAD_FILE);
				Log.d(TAG, path.getAbsolutePath());

			}

			private void loadFileList() {			
				try {
					path.mkdirs();
				} catch (SecurityException e) {
					Log.e(TAG, "unable to write on the sd card ");
				}

				// Checks whether path exists
				if (path.exists()) {
					FilenameFilter filter = new FilenameFilter() {
						public boolean accept(File dir, String filename) {
							File sel = new File(dir, filename);
							// Filters based on whether the file is hidden or not
							return (sel.isFile() || sel.isDirectory())
									&& !sel.isHidden();

						}
					};

					String[] fList = path.list(filter);
					fileList = new Item[fList.length];
					for (int i = 0; i < fList.length; i++) {
						fileList[i] = new Item(fList[i], R.drawable.file_icon);

						// Convert into file path
						File sel = new File(path, fList[i]);

						// Set drawables
						if (sel.isDirectory()) {
							fileList[i].icon = R.drawable.directory_icon;
						} else {
						//	Log.d("FILE", fileList[i].file);
						}
					}

					if (!firstLvl) {
						Item temp[] = new Item[fileList.length + 1];
						for (int i = 0; i < fileList.length; i++) {
							temp[i + 1] = fileList[i];
						}
						temp[0] = new Item("Back", R.drawable.directory_up);
			
						fileList = temp;
					}
				} else {
					Log.e(TAG, "path does not exist");
				}

				adapter = new ArrayAdapter<Item>(this,
						android.R.layout.select_dialog_item, android.R.id.text1,
						fileList) {
					@Override
					public View getView(int position, View convertView, ViewGroup parent) {
						// creates view
						View view = super.getView(position, convertView, parent);
						TextView textView = (TextView) view
								.findViewById(android.R.id.text1);

						// put the image on the text view
						textView.setCompoundDrawablesWithIntrinsicBounds(
								fileList[position].icon, 0, 0, 0);

						// add margin between image and text (support various screen
						// densities)
						int dp5 = (int) (5 * getResources().getDisplayMetrics().density + 0.5f);
						textView.setCompoundDrawablePadding(dp5);

						return view;
					}
				};

			}

			public class Item {
				public String file;
				public int icon;

				public Item(String file, Integer icon) {
					this.file = file;
					this.icon = icon;
				}

				@Override
				public String toString() {
					return file;
				}
			}

			@Override
			protected Dialog onCreateDialog(int id) {
				Dialog dialog = null;
				AlertDialog.Builder builder = new Builder(this);

				if (fileList == null) {
					Log.e(TAG, "No files loaded");
					dialog = builder.create();
					return dialog;
				}

				switch (id) {
				case DIALOG_LOAD_FILE:
					builder.setTitle("Choose your file");
					builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int which) {
							chosenFile = fileList[which].file;
							File sel = new File(path + "/" + chosenFile);
							if (sel.isDirectory()) {
								firstLvl = false;

								// Adds chosen directory to list
								str.add(chosenFile);
								fileList = null;
								path = new File(sel + "");

								loadFileList();

								removeDialog(DIALOG_LOAD_FILE);
								showDialog(DIALOG_LOAD_FILE);
								Log.d(TAG, path.getAbsolutePath());

							}

							// Checks if 'back' was clicked
							else if (chosenFile.equalsIgnoreCase("back") && !sel.exists()) {

								// present directory removed from list
								String s = str.remove(str.size() - 1);

								// path modified to exclude present directory
								path = new File(path.toString().substring(0,
										path.toString().lastIndexOf(s)));
								fileList = null;

								// if there are no more directories in the list, then
								// its the first level
								if (str.isEmpty()) {
									firstLvl = true;
								}
								loadFileList();

								removeDialog(DIALOG_LOAD_FILE);
								showDialog(DIALOG_LOAD_FILE);
								Log.d(TAG, path.getAbsolutePath());

							}
							// File picked
							else {
								// Perform action with file picked
								Intent i = new Intent();
								i.putExtra("SelectedFile", sel.getAbsolutePath());
								
								try {
									
									FileReader fr = new FileReader(sel);
									BufferedReader br = new BufferedReader(fr);
				        		      String line;
				        		      int j=1;
				        		      while (( line = br.readLine()) != null) {
				        		    	  if(j==1){
				        		    		  i.putExtra("access_key", line);
				        		    	  }
				        		    	  else if(j == 2){
				        		    		  i.putExtra("secret_key", line);
				        		    	  }
				        		    	  else{
				        		    		  break;
				        		    	  }
				        		    	  j++;
				        		      }
				        		 
				        		  } catch (Exception e) {
				        		    Log.v(TAG, "Exception: "+e);
				        		  } 
								setResult(Activity.RESULT_OK, i);
								finish();
								
							}

						}
					});
					break;
				}
				dialog = builder.show();
				return dialog;
			}

	
}
